<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        html {
            height: 5000px;
        }
    </style>
</head>

<body>

</body>
<script>
    // 函数嵌套
    // 函数fn在执行过程中 有点用了func  => 并将func的返回值作为fn的返回值
    /* function fn() {
        var a = 10; // 10 => 11
        function func() {
            a++;  //  应用了作用域链 但是没有形成闭包
            return a;
        }
        return func(); // 11
    }
    var result = fn();
    console.log(result); */

    // 闭包 
    // 1. 函数在执行过程返回了另一个函数(也可以在数组对象中返回0)
    // 2. 返回的函数使用了父作用域的变量
    // 3. 函数外有变量引用了被返回的函数

    /* function fn() {
        var a = 10; // 10 => 11
        function func() {
            a++;  //  应用了作用域链 但是没有形成闭包
            return a;
        }
        return func;
        // return {
        //     func: func
        // }
    }

    var result = fn(); // result = func
    console.log(result);

    var res = result(); // 11  调用result 等价于 调用func
    console.log(res);

    var res = result(); // 12
    console.log(res);

    var result = fn(); // 再次调用fn => 返回新的func
    console.log(result);

    var res = result(); // 11  调用result 等价于 调用func
    console.log(res);

    var res = result(); // 12
    console.log(res); */

    function debounce(callback, delay = 0) {
        var timer = null;
        return function () {
            clearTimeout(timer);
            timer = setTimeout(function () {
                callback.apply(this, arguments);
            }, delay);
        }
    }

    function throttle(callback, delay = 0) {
        var start = Date.now();
        return function () {
            var now = Date.now();
            if (now - start >= delay) {
                // 函数调用时 将外层函数this执行和参数传递给callback
                callback.apply(this, arguments);
                start = now;
            }
        }
    }
    // throttle(callback,delay) => newFn => newFn() => callback()

    var newFn = throttle(function () {
        console.log(11111, this);
    }, 300)

    // setInterval(function () {
    //     newFn(1, 2);
    // }, 10);

    // window.onscroll = newFn;







</script>

</html>